package com.alibaba.smart.framework.engine.constant;

import lombok.Getter;

/**
 * 并行网关扩展属性常量
 *
 * @author guoxing
 * @date 2020年11月16日19:29:08
 */
public final class ParallelGatewayConstant {

  /**
   * private scope constructor for avoid new instance
   */
  private ParallelGatewayConstant() {
  }

  /**
   * 自定义属性名：等待超时时间，单位毫秒。
   */
  public static final String WAIT_TIME_OUT = "timeout";
  /**
   * 自定义线程池名称
   */
  public static final String POOL_NAME = "poolName";
  /**
   * 当超时异常时,是否跳过
   */
  public static final String SKIP_TIMEOUT_EXCEPTION = "skipTimeoutExp";

  /**
   * 执行策略，value为code对应的数字
   */
  public static final String EXE_STRATEGY = "strategy";


  public enum ExecuteStrategy {
    /**
     * 执行所有
     */
    INVOKE_ALL("all", "执行所有"),
    /**
     * 返回最快的那个，中断其他进行中的并行线程
     */
    INVOKE_ANY("any", "返回最快的任意一个");

    /**
     * 1 表示执行所有
     * 2 表示执行最快的那个，类似race模式
     */
    @Getter
    private final String code;
    /**
     * 策略的描述
     */
    @Getter
    private final String desc;

    ExecuteStrategy(String code, String desc) {
      this.code = code;
      this.desc = desc;
    }


    /**
     * 返回一个执行策略
     *
     * @param code
     * @return
     */
    public static ExecuteStrategy build(String code) {
      ExecuteStrategy[] strategies = ExecuteStrategy.values();
      for (ExecuteStrategy strategy : strategies) {
        if (strategy.getCode().equalsIgnoreCase(code)) {
          return strategy;
        }
      }
      return null;
    }

  }
}
